package com.zhangtao.note.service;

import cn.hutool.core.util.StrUtil;
import com.zhangtao.note.dao.NoteTypeDao;
import com.zhangtao.note.po.NoteType;
import com.zhangtao.note.vo.ResultInfo;

import java.util.List;

public class NoteTypeService {
    private NoteTypeDao typeDao = new NoteTypeDao();

    public List<NoteType> findTypeList(Integer userId) {
        List<NoteType> typeList = typeDao.findTypeListByUserId(userId);
        return typeList;
    }

    /**
     * 删除类型
     1. 判断参数是否为空
     2. 调用Dao层，通过类型ID查询云记记录的数量
     3. 如果云记数量大于0，说明存在子记录，不可删除
     code=0，msg="该类型存在子记录，不可删除"，返回resultInfo对象
     4. 如果不存在子记录，调用Dao层的更新方法，通过类型ID删除指定的类型记录，返回受影响的行数
     5. 判断受影响的行数是否大于0
     大于0，code=1；否则，code=0，msg="删除失败"
     6. 返回ResultInfo对象
     * @param typeId
     * @return
     */
    public ResultInfo<NoteType> deleteType(String typeId) {
        ResultInfo<NoteType> resultInfo = new ResultInfo<>();
        // 1. 判断参数是否为空
        if (StrUtil.isBlank(typeId)) {
            resultInfo.setCode(0);
            resultInfo.setMsg("系统异常，请重试！");
            return resultInfo;
        }

        // 2. 调用Dao层，通过类型ID查询云记记录的数量
        long noteCount = typeDao.findNoteCountByTypeId(typeId);

        // 3. 如果云记数量大于0，说明存在子记录，不可删除
        if (noteCount > 0) {
            resultInfo.setCode(0);
            resultInfo.setMsg("该类型存在子记录，不可删除！！");
            return resultInfo;
        }

        // 4. 如果不存在子记录，调用Dao层的更新方法，通过类型ID删除指定的类型记录，返回受影响的行数
        int row = typeDao.deleteTypeById(typeId);

        // 5. 判断受影响的行数是否大于0
        if (row > 0) {
            resultInfo.setCode(1);
        } else {
            resultInfo.setCode(0);
            resultInfo.setMsg("删除失败！");
        }
        return resultInfo;
    }

    //添加或修改类型方法
    public ResultInfo<Integer> addOrUpdate(String typeName, Integer userId, String typeId) {
        ResultInfo<Integer> resultInfo = new ResultInfo<>();
        //1.判断参数是否为空
        if (StrUtil.isBlank(typeName)){
             resultInfo.setResult(0);
             resultInfo.setMsg("类型名称不能为空");
             return resultInfo;
        }

        //调用dao
        Integer code = typeDao.checkTypeName(typeName, userId, typeId);
        //如果不可用
        if (code ==0){
            resultInfo.setCode(0);
            resultInfo.setMsg("类型名称已存在，请重新输入");
            return resultInfo;
        }
        //判断类型id是否为空
        Integer key = null;
        if (StrUtil.isBlank(typeId)){
            //如果为空调用dao层的添加方法，返回主键
            key = typeDao.addType(typeName, userId);
        }else {
            //如果不为空返回受影响的行数
            key = typeDao.updateType(typeName, typeId);
        }
        //判断主键受影响行数是否大于0
        if (key > 0){
            resultInfo.setCode(1);
            resultInfo.setResult(key);
        }else{
            resultInfo.setCode(0);
            resultInfo.setMsg("更新失败");
        }
        return resultInfo;
    }
}
